/**
 * Created by Administrator on 2017/12/12.
 */


 
// ***************************** 第二节、 三种声明方式***************************************

let b = 2;
var  a = "sunkn"  //全局的
console.log(a);

window.onload = function(){
    console.log(a);
}

{
    var a= "孙克宁" //覆盖前面的 a
}
console.log(a);//孙克宁

// 局部声明
{
    let a = "test"; //块作用域

}
console.log(a); //undefined


for(var i = 0;i<10;i++){
    console.log(i);
}
console.log("循环体外"+i);//外边数据被污染

for(let i=0;i<0;i++){
    console.log(i); //块级作用域
}
console.log("循环体外"+i);//undefined 

// 常量声明
const F = "sunkn";

// ***************************** 第三节 变量的解构赋值***************************************


//1、简单的数组结构
// let a = 1;
// let b = 2;
// let c = 3;

let[a1,b1,c3] = [1,2,3];
console.log(a1);
console.log(b1);
console.log(c3);

//2、默认值
let [foo="true"] = []; 
console.log(foo); //true;
let [a2,b2="sunkn"] = ["djningls"]
console.log(a2+b2);
//注意点  undefined null
let [a3,b3="sunkn"] = ["djningls",undefined]
console.log(a3+b3); // djninglssunkn
let [a4,b4="sunkn"] = ["djningls",null]
console.log(a4+b4); // djningls null


// 3、对象解构  注意点:解构的变量名必须和对象的key值对应
 
let {age,name} = {age:"13",name:"孙克宁"}
console.log(age+name);

let foo1; 
({foo1} = {foo1:"sddf"}); //注意点：无论你使用var let 进行了先赋值，必须增加上 （） 圆括号才能解构成功

//4、 字符串的解构 
a
const [a6,b6,c6,d6,] = 'djni';
console.log(a6);//d
console.log(b6);//j
console.log(c6);//n
console.log(d6);//i


// ************************************第四讲 扩展运算符和rest运算符    ******************************
// 1、对象扩展运算符 对象扩展运算符（…）：
console.log("对象扩展运算符 对象扩展运算符（…）：");
function djnin(...args){
    console.log(args[0]);
    console.log(args[1]);
    console.log(args[2]);
    console.log(args[3]);
}
djnin(1,2,3,4,5,6);

//2、 扩展运算符的用处：

 //我们声明两个数组，arr1 arr2 将arr1 赋值给arr2  此时修改arr2 的数据，发现arr1同时也会改变，
 // 因为我们这是对内存堆栈的引用，而不是真正的赋值.
 let arr1 = ["tes","test2","test3"];
 let arr2 = arr1;
 console.log("arr2");
 console.log(arr2);  //["tes","test2","test3"];
 arr2.push("arr2Push");
 console.log(arr1); ["tes","test2","test3","arr2Push"];

 //以上结果不是我们想看到的，可以利用对象扩展运算简单的解决这个问题
 let arr3 = ['test1','test2','test3'];
 let arr4 = [...arr3]; //对象扩展运算
 console.log(arr4);
 arr4.push("arr4Push");
 console.log(arr3);
 console.log(arr4);


//  3、rest 运算符
// 1、rest 简单用法
function rest(first,...arg){
    console.log("长度"+arg.length);
}
rest(12,2,2,3,3,3,3,33,3);
// 2、如何循环输出rest运算符  
// for…of的循环可以避免我们开拓内存空间，增加代码运行效率，所以建议大家在以后的工作中使用for…of循环
function rest1(first,...args){
   for(let val of args){
       console.log(val);
   }
}
rest1("ning1","ning2","ning3");


